同源&跨域
同源
同源策略是浏览器的一种安全策略(ajax 不允许跨域获取数据),所谓同源是指,域名,协议,端口完全相同。
跨域
1 2 3 4 5 6 7
| http://api.example.com/detail.html 不同源 域名不同 https//www.example.com/detail.html 不同源 协议不同 http://www.example.com:8080/detail.html 不同源 端口不同 http://api.example.com:8080/detail.html 不同源 域名、端口不同 https://api.example.com/detail.html 不同源 协议、域名不同 https://www.example.com:8080/detail.html 不同源 端口、协议不同 http://www.example.com/detail/index.html 同源 只是目录不同
|
解决跨域获取数据的方案:
1、jsonp
2、Apache反向代理
jsonp
jsonp 原理:
利用script标签的src属性发送的请求可以跨域获取数据
比较方便的做法就是动态创建script标签,然后通过标签的src属性发送跨域请求,并且可以携带参数,后台响应的内容是js代码【函数调用】
1 2 3 4 5
| var script = document.createElement('script'); var param = '?flag=123&callback=hello'; script.src = 'http://vis.com/data.php' + param; var head = document.getElementsByTagName('head')[0]; head.appendChild(script);
|
jQuery ajax方法
1 2 3 4 5 6 7 8 9 10 11 12
| $.ajax({ url : 'http://vis.com/data.php', jsonp : 'abc', jsonpCallback : 'helloworld', dataType : 'jsonp', data : {flag:123}, success : function(data){ console.log(data); } });
|
模拟 jQuery 封装 ajax 方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| function ajax(obj){ var defaults = { jsonp : 'callback' } for(var key in obj){ defaults[key] = obj[key]; } var cbName = 'jQuery' + ('v1.11.1' + Math.random()).replace(/\D/g,'') + '_' + new Date().getTime(); if(defaults.jsonpCallback){ cbName = defaults.jsonpCallback; } window[cbName] = function(data){ defaults.success(data); } var script = document.createElement('script'); var param = ''; if(defaults.data){ for(var key in defaults.data){ param += key + '=' + defaults.data[key] + '&'; } } script.src = defaults.url + '?' + param + defaults.jsonp + '=' + cbName; var head = document.getElementsByTagName('head')[0]; head.appendChild(script); } ajax({ url : 'http://vis.com/data.php', jsonp : 'abc', jsonpCallback : 'hello', data : {flag : 123,uname : 'kitty'}, dataType : 'jsonp', success : function(data){ console.log(data.username); } });
|
Apache反向代理
在ajax交互时url改成 url : ‘/代理名/访问对象’,